package com.bw.aop;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 *配置类
 */
//@Component // 把这个对象放入容器
//@Aspect // 织面
public class MyAop {


    /**
     * 前置通知     原方法运行之前执行
     *
     * execution 切入点表达式  用来匹配方法的，如果匹配到方法，这个方法就会被增强
     * @param joinPoint
     */
    @Before("execution( * com.bw.service.*.*(..))")
    public void  before(JoinPoint joinPoint){
        Object[] args = joinPoint.getArgs();
        String name = joinPoint.getSignature().getName();
        System.out.println("方法：" + name + "入参是：" + JSON.toJSONString(args));
    }

    /**
     * 后置通知  在原方法运行之后 执行
     * @param joinPoint
     * @param result
     */
    @AfterReturning(returning = "result", pointcut = "execution( * com.bw.service.*.*(..))")
    public void  afterRetuning(JoinPoint joinPoint,Object result){

        String name = joinPoint.getSignature().getName();
        System.out.println("方法：" + name + "返参是：" + JSON.toJSONString(result));
    }


    //异常抛出增强
    @AfterThrowing("execution( * com.bw.service.*.*(..))")
    public void afterThrow() {
        System.out.println("----@AfterThrowing 异常时执行------");
    }
    //final增强，不管是抛出异常或者正常退出都会执行
    @After("execution( * com.bw.service.*.*(..))")
    public void afterFinal() {
        System.out.println("----@After 最后一定会执行------");
    }

}
